If a vcpu is pinned to multiple physical cpus, the pinning is not
removed if all those physical cpus are removed from the cpupool. When
disabling the scheduler on a cpu, the affinity mask must be checked
against the cpumask of the cpupool.
Signed-off-by: Juergen Gross <juergen.gross@ts.fujitsu.com>
struct domain *d;
struct vcpu *v;
struct cpupool *c;
+ cpumask_t online_affinity;
int ret = 0;
bool_t affinity_broken;
{
vcpu_schedule_lock_irq(v);
- if ( (cpus_weight(v->cpu_affinity) == 1) &&
+ cpus_and(online_affinity, v->cpu_affinity, c->cpu_valid);
+ if ( cpus_empty(online_affinity) &&
cpu_isset(cpu, v->cpu_affinity) )
{
printk("Breaking vcpu affinity for domain %d vcpu %d\n",